Java 面试准备:15个Java 面试问题

您所在的位置:网站首页 java 条件变量 Java 面试准备:15个Java 面试问题

Java 面试准备:15个Java 面试问题

2023-03-17 12:43| 来源: 网络整理| 查看: 265

并不是所有的面试都会关注算法和数据结构——通常情况下,面试只会关注你声称是专家的语言或技术。在这样的面试中,通常没有任何“陷阱”问题,而是它们要求您利用记忆和你使用该语言的经验——换句话说,它们测试你对编程语言的了解。

但是,很容易忘记像 Java 这样的语言的所有来龙去脉,因为简单地说,我们不会处理诸如“JVM 管理什么样的内存?”这样的问题,以及“用一个例子描述多态性”。

Q1:是什么让 Java 平台独立?

Java 的工作原理是一次编写,随处运行。一旦编写了 Java 程序,它就会被编译成所谓的字节码,然后可以在任何 Java 虚拟机或简称为 JVM 上运行。

编译为字节码是 Java 互操作性背后的魔力。不同的操作系统和硬件架构都有为它们自己定制设计的 JVM,所有 JVM 都可以运行相同的字节码。因此,如果您在 Linux 上编写 Java 程序,它将在专为 Windows 操作系统设计的 JVM 上无缝运行,从而使代码与底层硬件和操作系统无关。

Q2:解释一下JRE、JDK、JVM的概念

JRE(Java 运行时环境)包括 Java 虚拟机和标准 Java API(核心类和支持文件)。JRE 包含的内容刚好足以执行 Java 应用程序,但不足以对其进行编译。

JDK(Java Development Kit)是 JRE 加上 Java 编译器,以及一组用于编译和调试代码的其他工具。JRE 由 Java 平台库、Java 虚拟机 (JVM)、Java 插件和 Java Web Start 组成,用于运行 Java 应用程序。作为独立的 JRE 不包含编译器和调试工具。如果您需要开发 Java 程序,您需要完整的 Java SDK。JRE 不足以进行程序开发。只有完整的 Java SDK 包含将您的.java源文件转换为字节码.class文件的 Java 编译器。

JVM(Java 虚拟机)是一种规范的实现,详细说明了 JVM 的预期行为。任何符合 JVM 规范的实现都应该能够运行编译成 Java 字节码的代码,而不管代码最初是用什么语言编写的。在 Java 编程语言中,所有源代码首先写在以.java扩展名结尾的纯文本文件中。然后这些源文件被编译器编译成.class 文件javac。文件.class不包含处理器的本机代码;它包含字节码——Java 虚拟机的机器语言。java 启动器工具然后使用 Java 虚拟机实例运行您的应用程序。

Q3:如何在 Java 中将实体包标记为私有?

包私有没有显式修饰符。在没有任何修饰符的情况下,类或成员变量是包私有的。标记为 package private 的成员仅在其自己的包中可见。考虑下面的类。

私有包是一种稍微宽泛的私有形式。package-private 的一个好处是你可以使用它来访问你认为私有的方法给单元测试类。

因此,如果你使用的辅助类除了帮助你的公共类完成客户需要的事情外没有其他用途,那么将它们打包为私有是有意义的,因为你希望让库的用户尽可能简单。

Q4:为什么要避免Object类中的finalize()方法?有哪些替代方案?

Object 类提供了一个回调方法,可以在对象变成垃圾时调用finalize()方法。对象的实现finalize()什么都不做——可以重写finalize()以进行清理,例如释放资源。

方法finalize()可能会被系统自动调用,但是什么时候调用,或者是否调用,都是不确定的。因此,不应依赖此方法为您进行清理。例如,如果在执行 I/O 后没有关闭代码中的文件描述符,而希望finalize()关闭它们,那么你可能会用完文件描述符。

这里有一些选择:

try-with-resources 习语可用于清理对象。这需要实现AutoCloseable接口。

在对象被垃圾回收时使用PhantomReference执行清理

使用Cleaner类执行清理操作。

实现一个close()方法,该方法执行清理并记录调用该方法。

Q5:你能像下面的代码片段那样改变最终数组的内容吗?

这可能看起来违反直觉,但我们实际上可以更改数组的内容,即使它被标记为 final。数组变量指向内存中放置数组内容的特定起始位置。

位置或内存地址无法更改。例如,下面的代码将不会编译:

但是,以下代码将起作用。

Q6:解释一下接口和抽象类的区别?什么时候应该使用其中一个?

抽象类不能被实例化,但可以被子类化。抽象类通常包含抽象和非抽象方法,子类被迫为其提供实现。

接口是一个完全“抽象类”,用于将具有空主体的相关方法分组。

每个都允许在 Java 中进行高级 OOP 构造。

以下是抽象类和接口之间的四个主要区别:

抽象类可以有 final 变量、静态变量或类成员变量,而接口默认只能有 final 和 static 变量。

抽象类可以有静态、抽象或非抽象方法。接口可以有静态、抽象或默认方法。

抽象类的成员可以具有不同的私有、受保护或公共可见性。而在接口中,所有方法和常量都是公共的。

一个类只能扩展另一个类,但它可以实现多个接口。同样,一个接口可以扩展多个接口。接口从不实现类或接口。

当子类共享状态或使用公共功能时使用抽象类。或者需要声明非静态、非最终字段或需要 public 以外的访问修饰符。

如果你希望不相关的类会实现你的接口,请使用接口。例如,接口 Comparable 和 Cloneable 由许多不相关的类实现。接口也用于需要多重继承类型的情况。

Q7:什么是多态?你能给个例子吗?

多态性是面向对象编程中为不同的底层形式或数据类型呈现相同接口的能力。多态性是指可以将对象视为某物的通用版本,但是当访问它时,代码会确定它的确切类型并调用相关代码。这意味着多态性允许你的代码使用不同的类而无需知道它使用的是哪个类。

多态性用于使应用程序更加模块化和可扩展。你可以创建可根据需要选择的可互换对象,而不是描述不同操作过程的混乱条件语句。这是多态性的基本目标。

多态性的经典例子是类Shape。我们从父类Shape派生Circle、Triangle和 Rectangle类,它公开了一个抽象方法 draw()。派生类为draw()方法提供它们的自定义实现。现在,通过在每个对象上调用draw()方法,可以很容易地渲染包含在同一个数组中的不同类型的形状。这使我们不必为每个形状创建单独的绘制方法drawTriangle(),例如 drawCircle()等。

Q8:main方法可以重载吗?

是的,main该方法是静态方法,可以重载。但只有public static void main(String[] args)在 JVM 启动你的类时才会使用,即使指定了一个或两个命令行参数。但是,可以通过编程方式调用该main方法的重载版本。

Q9:如何在每次调用时将多个参数传递给一个方法?

我们可以使用 feature 将可变数量的参数传递给方法varargs。下面是将相同类型的多个参数传递给方法的示例。

类型名称后跟三个点、一个空格,然后是变量名称。

该varargs变量被视为一个数组。

变量varargs必须出现在方法签名的最后。

由于上述原因,varargs方法签名中只能有一个。

可以按如下方式调用上述方法:

Q10:信号量可以充当互斥量吗?

如果信号量可以发出的许可数设置为 1,则它可以潜在地充当互斥锁。但是,两者之间最重要的区别是,在互斥锁的情况下,同一线程必须调用获取和后续释放互斥量,而在二进制信号量的情况下,不同的线程可以在信号量上调用获取和释放。

这使我们想到了“所有权”的概念。互斥锁由获取它的线程拥有,直到它释放它,而对于信号量,没有所有权的概念。

Q11:解释Externalizable接口

Serializable接口为我们的类对象提供了自动序列化功能。另一方面,Externalizable接口提供了一种实现自定义序列化机制的方法。实现Externalizable接口的类负责保存和恢复其自身实例的内容。

Externalizable接口扩展了Serializable接口并提供了两种方法来序列化和反序列化一个对象,writeExternal()以及readExternal().

Q12:如果一个代码块抛出多个异常,如何处理?

一段代码抛出的多种类型的异常可以通过多个 catch 块子句后跟 try 块来处理。异常处理的示例片段如下所示:

Q13:如果你要使用集合,你会如何判断是 HashSet 还是 TreeSet?

最初,你可能想使用 HashSet数据结构,因为它会给你带来更好的时间复杂度,但它不能保证集合的迭代顺序;特别是,它不保证顺序会随着时间的推移保持不变。

因此,如果想维护顺序,最好使用 TreeSet,因为它按升序而不是按插入顺序存储键。它不是线程安全的。但是,请记住 TreeSet 不是线程安全的,而 HashSet 是。

问题 14:有哪些方法可以改善 Java 应用程序的内存占用?

可以采取以下三个关键步骤来改善内存占用:

限制局部变量的范围。每次弹出堆栈的顶部作用域时,该作用域的引用都会丢失,这可能会使对象符合垃圾回收条件。

null在不需要时显式设置变量引用。这将使对象符合垃圾收集的条件。

避免终结器。它们会降低程序性能并且不提供任何保证。

Q15:实现单例类的最佳方式是什么?

按照 Josh Bloch 的说法,实现单例的最佳方法是enum为单例使用类型。因为 Java 确保enum只会创建单个实例,所以通过 实现的单例类enums不会受到反射和序列化攻击。

这篇文章涵盖了很多关于 Java 编程语言的内容,从 Java 生态系统到多线程 和异常。这些是你可以预期的 Java 面试问题类型。然而,这里的材料只是划伤了表面。还有更多的概念需要重新审视或探索。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3